const multer = require('multer');
const path = require('path');
const fs = require('fs');

// 确保上传目录存在
const createUploadDirectories = () => {
    const directories = [
        'uploads/',
        'uploads/images/',
        'uploads/videos/',
        'uploads/audios/',
        'uploads/documents/'
    ];

    directories.forEach(dir => {
        if (!fs.existsSync(dir)) {
            fs.mkdirSync(dir, { recursive: true });
        }
    });
};

// 创建上传目录
createUploadDirectories();

// 配置文件存储
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        let uploadPath = 'uploads/';
        
        // 获取文件的 MIME 类型和扩展名
        const mimeType = file.mimetype.toLowerCase();
        const extension = path.extname(file.originalname).toLowerCase();
        
        // 根据文件类型和扩展名设置上传路径
        if (mimeType.startsWith('image/')) {
            uploadPath += 'images/';
        } else if (mimeType.startsWith('video/')) {
            uploadPath += 'videos/';
        } else if (mimeType.startsWith('audio/')) {
            uploadPath += 'audios/';
        } else {
            // 检查压缩文件扩展名
            const compressedExtensions = ['.zip', '.rar', '.7z', '.tar', '.gz'];
            if (compressedExtensions.includes(extension)) {
                uploadPath += 'documents/';
            } else {
                uploadPath += 'documents/';
            }
        }
        
        cb(null, uploadPath);
    },
    filename: function (req, file, cb) {
        try {
            const originalName = Buffer.from(file.originalname, 'latin1').toString('utf8');
            const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
            cb(null, uniqueSuffix + path.extname(originalName));
        } catch (error) {
            console.error('文件名处理错误:', error);
            cb(error);
        }
    }
});

// 文件过滤器
const fileFilter = (req, file, cb) => {
    try {
        // 获取文件扩展名
        const extension = path.extname(file.originalname).toLowerCase();
        
        // 允许的压缩文件扩展名
        const compressedExtensions = ['.zip', '.rar', '.7z', '.tar', '.gz'];
        
        // 检查是否为压缩文件
        if (compressedExtensions.includes(extension)) {
            cb(null, true);
            return;
        }
        
        // 检查其他文件类型
        const mimeType = file.mimetype.toLowerCase();
        if (
            mimeType.startsWith('image/') ||
            mimeType.startsWith('video/') ||
            mimeType.startsWith('audio/') ||
            mimeType.startsWith('application/') ||
            mimeType.startsWith('text/')
        ) {
            cb(null, true);
        } else {
            cb(null, true); // 允许所有其他类型的文件
        }
    } catch (error) {
        console.error('文件过滤器错误:', error);
        cb(error);
    }
};

// 错误处理中间件
const handleMulterError = (err, req, res, next) => {
    if (err instanceof multer.MulterError) {
        // Multer 错误
        console.error('Multer 错误:', err);
        if (err.code === 'LIMIT_FILE_SIZE') {
            return res.status(400).json({ error: '文件大小超过限制' });
        }
        if (err.code === 'LIMIT_FILE_COUNT') {
            return res.status(400).json({ error: '文件数量超过限制' });
        }
        return res.status(400).json({ error: '文件上传错误' });
    } else if (err) {
        // 其他错误
        console.error('上传错误:', err);
        return res.status(500).json({ error: '服务器错误' });
    }
    next();
};

// 设置文件上传限制
const upload = multer({
    storage: storage,
    fileFilter: fileFilter,
    limits: {
        fileSize: 1000 * 1024 * 1024, // 限制文件大小为1000MB
        files: 200 // 允许上传的最大文件数量
    }
});


// 直接导出 upload 实例
module.exports = upload;

// 如果需要导出错误处理中间件，可以单独导出
module.exports.handleMulterError = handleMulterError;